/** @jsxImportSource @emotion/react */
import * as React from "react";
import {
    Text, useTheme, Button, useToast, TextArea, InputLine, SuffixInput, Input, LineColumn,
} from "customize-easy-ui-component";
import {
    InspectRecordLayout, InternalItemProps, SelectHookfork, useItemInputControl
} from "../../common/base";
import {setupItemAreaRoute} from "./orcIspConfig";
import {useMedia} from "use-media";
import {assertNamesUnique} from "../../common/eHelper";
import {EachMeasureItemConfig, } from "../../common/measure";
import {useMeasureInpFilter} from "../../common/hooks";
import {EditorProps} from "../../common/editor";
import {itemA结论,} from "../../mobilecr/editorIN";
import {config梯子, itemA漏磁检, itemB受力结构} from "../../park/editor";
import {objNestSet, tableSetInp} from "../../../common/tool";
import {itemA技术见证, itemA附设装} from "../editorDj";

export const 施工许可证子项选=['曳引驱动乘客电梯','曳引驱动载货电梯','曳引驱动乘客电梯（含消防员电梯）'];
export const 操纵方式选= ["地面操纵", "司机室操纵", "遥控", "多点操纵", "其它", "遥控", "其它", "地面操作", "司机室操作", "操作平台操作", "地面+司机室", "地面+遥控", "遥控+司机室", "地面+遥控+司机室"];
export const 作业环境选=["室内", "室外", "吊运熔融金属", "吊运炽热固体", "防爆", "绝缘"];
export const 检验时吊具选=['吊钩','集装箱吊具','抓斗','起重电磁铁','真空吸盘','夹钳','其他'];
export const 升悬挂部件选=['钢丝绳','环链','纤维绳','钢铰线','其他'];
export const config设备概况 = [
    [['使用单位名称', '_$使用单位'] ],
    [['使用单位地址', '_$使用单位地址'] ],
    [['分支机构', '_$分支机构'] ],
    [['分支机构地址', '_$分支机构地址'] ],
    [['产权单位名称', '_$产权单位'] ],
    [['产权单位地址', '_$产权单位地址'] ],
    [['使用单位联系人', '_$单位联系人'], ['使用单位安全管理人员', '安全员']],
    [['使用单位联系电话', '_$使用单位电话'], ['安全管理人员联系电话', '安全员电']],
    [['邮政编码', '_$使用单位邮编'], [' ',{r:''}] ],
    [['使用单位统一社会信用代码', '_$使用单位信用码'], ['管理部门类型','_$使管部类型']],
    [['制造单位名称', '_$制造单位'] ],
    [['制造单位生产许可证编号', '生产许号'], ['制造单位生产许可证许可子项目', {n: '制许可子', t: 'l', l: 施工许可证子项选}], ],
    [['安装单位名称','_$安装单位']],
    [['安装单位特种设备生产许可证（受理决定书）编号','许可书号'],['安装单位生产许可证许可子项目','施许可子']],
    [['改造单位名称','_$改造单位']],
    [['重大修理单位名称','_$维修单位']],
    [['设备型号', '设备型号'], ['产品编号', '_$出厂编号']],
    [['型号规格', '_$型号'], ['制造日期', '_$制造日期']],
    [['操纵方式',{n:'操纵方式',t:'l',l:操纵方式选}],['作业环境',{n:'作业环境',t:'l',l:作业环境选}]],
    [['单位内编号','_$单位内部编号'],['进口情况','_$进口类型']],
    [['设计使用年限','_$设计年限', '年'], ['投入使用日期', '_$投用日期']],
    [['使用地点', '_$设备使用地点']],
    [['设备使用地点所在区域', '_$使用地区域'] ],
    [['额定起重量','_$额定起重量','t'],['额定起重力矩','_$起重力矩','t·m']],
    [['起升高度',{n:'起升高度',t:'n',u:'m'}], ['下降深度','_$下降深度','m']],
    [['工作幅度',{n:'工作幅度', u:'m'}], ['工作级别','_$工作级别']],
    [['主起升机构额定起重量',{n:'主起额起',u:'t'}],['副起升机构额定起重量','_$起升副额起','t']],
    [['起升速度','_$起升速','m/min'],['大车运行速度','_$大车速度','m/min']],
    [['变幅速度','_$变幅速度','m/min'], ['回转速度','_$回转速度','r/min'] ],
    [['尾部回转半径',{n:'尾部回半',t:'n',u:'m'}], ['门腿净空高度',{n:'门腿净高',t:'n',u:'m'}]],
    [['其他主要参数',{n:'其他参数',t:'m'}], ],
    [['检验时吊具',{n:'检吊具',t:'l',l:检验时吊具选}],['主起升机构起升悬挂部件',{n:'主起悬挂',t:'l',l:升悬挂部件选}]],
    [['检验依据',{r:'《起重机械安全技术规程》（TSG 51-2023）'}]],
    [['下次定期检验日期','_$新下检日'],['是否流动作业',{n:'流动作业',t:'b'}]],
    [['现场检验条件',{r:'见附录13'}],['是否型式试验样机',{n:'型试样机',t:'b'}]],
    [['附设装置名称','附设装']],
    [['检验意见通知书编号','意通知号'], ['整改反馈确认期限',{n:'改反馈期',t:'d'}] ],
    [['备注',{n:'概备注',t:'m'}]],
];
/**开启编制时的：默认值初始化操作。  若打印：本编辑器全部都不显示。
 * */
export const EntranceSetup =
React.forwardRef((
    {children, show, alone = true, repId, verId, rep}: InternalItemProps, ref
) => {
    const atPrint = useMedia('print');
    const theme = useTheme();
    const toast = useToast();
    const checkName = true;      //开发测试完，改成=false, 测试时 REACT_APP_TEST 需设置， 开发模式的校对开关。
    const doCheckNames = React.useCallback((verId: string) => {
        const impressionismAs = setupItemAreaRoute({rep, noDefault: true, theme});
        //几个固定都会有的，其余测量项目多出的，【第一次】可检查console.log看看assertNamesUnique: 正常吗。rep?.tzFields没有区分设备类型的。
        const result = assertNamesUnique([{value: rep?.tzFields}, {value: impressionismAs?.Item, type: 'impr'},
            {value: config设备概况, type:'esnt'}, {value:[...itemA结论,...itemA技术见证] }, {value: config观测数据, type: 'mesB'},
            {value: config梯子, type: 'mesB'},
            {value:[...itemB受力结构,...itemA起升高度,...itemA漏磁检,...itemA附设装, ]},
            {value:['unq','仪器表','检验条件', '观测备注', '梯子备注', ]} ]);
        toast({title: "完成！", subtitle: result ? "没发现冲突" : "测试开关没开", intent: "success"});
    }, [rep,theme,toast]);
    const getInpFilter = React.useCallback((par: any) => {}, []);
    const {inp, setInp} = useItemInputControl({ref});
    if (atPrint) return null;
    else return (
        <InspectRecordLayout inp={inp} setInp={setInp} getInpFilter={getInpFilter} show={show}
                             alone={alone} label={'初始化本报告，默认值配置等'}>
            {checkName && <div>
                <Text variant="h5">
                    构建开发模板时的工具：校验模板的存储name冲突；
                </Text>
                <Button intent='primary' onPress={() => {
                    doCheckNames(verId!);
                }}>校验模板name唯一性</Button>
            </div>
            }
            <hr/>
        </InspectRecordLayout>
    );
});
/**测量表：太多了可拆成两个编辑器； 注意：t: [] 不同于 t: [undefined,undefined,undefined]；
 * */
export const config观测数据 = [
    [{n: '卷筒板', t: ['C3.8.1','卷筒上压板数量'], u: '个'}, ],
    [{n: '绳夹数', t: [undefined,'绳夹数量'],  save: false},],
    [{n: '绳夹间', t: [undefined,'绳夹间距'],  u: 'mm', c: '弃', d: '2', save: false},],
    [{n: '编结长', t: [undefined,'钢丝绳编结长度'],  c: '弃', d: '2', save: false},],
    [{n: '安圈数', t: [undefined,'安全圈数'],  u: '圈', save: false},],
    [{check: 'C3.8.1', }],
    [{n: '敞护高', t: ['C3.10','敞开式司机室护栏高度'], u: 'm'}, ],
    [{check: 'C3.10'}],
    [{n: '电阻N', t: ['C3.11.3', 'TN系统重复接地电阻'], u: 'Ω', c: '四', d: '2', save: true},
        {n: '电阻T', t: [undefined, 'TT系统接地电阻'], c: '弃', d: '2', save: false},
        {n: '电阻I', t: [undefined, 'IT系统接地电阻'], c: '四', },
    ],
    [{check: 'C3.11.3'}],
    [{n: '绝缘阻', t: ['C3.14','主回路、控制回路、电气设备的相间绝缘电阻和对地绝缘电阻'], u: 'MΩ'}, ],
    [{check: 'C3.14'}],
] as EachMeasureItemConfig[][];


const itemA起升高度 = ['起高表','起高表r','行程表','行程表r','幅度表','幅度表r','回转表','回转表r', '监风速','监控备注'];
/**变换新思路： 编辑器采用简约原始文字流布局的。 不采用通用二维表编辑器形式做。
 * */
export const MonitoringGant =
    React.forwardRef((
        {children, show, alone = true, repId, verId, rep,label}: EditorProps, ref
    ) => {
        const [getInpFilter] = useMeasureInpFilter(null, itemA起升高度,);
        const {inp, setInp} = useItemInputControl({ ref });
        return (
            <InspectRecordLayout inp={inp} setInp={setInp} getInpFilter={getInpFilter} show={show}
                                 alone={alone} label={label!}>
                {label}, 7个项目:<br/>
                项目 C4.2.2.5.1.1 起升高度（m）{'>>'}
                <div css={{display: 'flex', margin: 'auto'}}>
                    <div css={{display: 'inline-block', margin: 'auto'}}>
                        {['1次','2次','3次'].map((group, i: number) => {
                            return <React.Fragment key={i}>
                                <Text variant="h5">{group}:</Text>
                                显示屏数值H1
                                <Input value={inp?.起高表?.[i]?.H1 ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('起高表',i, inp,setInp,'H1',e.currentTarget.value||undefined)}/>
                                (m)，H2
                                <Input value={inp?.起高表?.[i]?.H2 ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('起高表',i, inp,setInp,'H2',e.currentTarget.value||undefined)}/>
                                (m)，测量值h1
                                <Input value={inp?.起高表?.[i]?.h1 ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('起高表',i, inp,setInp,'h1',e.currentTarget.value||undefined)}/>
                                (m)，h2
                                <Input value={inp?.起高表?.[i]?.h2 ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('起高表',i, inp,setInp,'h2',e.currentTarget.value||undefined)}/>
                                (m)，计算值H
                                <Input value={inp?.起高表?.[i]?.H ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('起高表',i, inp,setInp,'H',e.currentTarget.value||undefined)}/>
                                (m)，h
                                <Input value={inp?.起高表?.[i]?.h ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('起高表',i, inp,setInp,'h',e.currentTarget.value||undefined)}/>
                                (m)。
                            </React.Fragment>;
                        })}
                        <br/><Text variant="h5" css={{display:'inline-flex'}}>起升高度-检验结果：</Text>
                        <div css={{width: '12rem', display: 'inline-flex', "& > div": {width: '100%'}}}>
                            <SelectHookfork value={(inp?.起高表r) || ''}
                                            onChange={e => setInp({...inp, 起高表r: e.currentTarget.value || undefined})}/>
                        </div>
                    </div>
                </div>
                项目 C4.2.2.5.1.2 运行行程（m）{'>>'}
                <div css={{display: 'flex', margin: 'auto'}}>
                    <div css={{display: 'inline-block', margin: 'auto'}}>
                        {['(1)小车','(2)大车'].map((group, i: number) => {
                            return <React.Fragment key={i}>
                                <Text variant="h5">{group}:</Text>
                                显示屏数值S1
                                <Input value={inp?.行程表?.[i]?.S1 ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('行程表',i, inp,setInp,'S1',e.currentTarget.value||undefined)}/>
                                (m)，S2
                                <Input value={inp?.行程表?.[i]?.S2 ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('行程表',i, inp,setInp,'S2',e.currentTarget.value||undefined)}/>
                                (m)，测量值s
                                <Input value={inp?.行程表?.[i]?.s ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('行程表',i, inp,setInp,'s',e.currentTarget.value||undefined)}/>
                                (m)，计算值S
                                <Input value={inp?.行程表?.[i]?.S ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('行程表',i, inp,setInp,'S',e.currentTarget.value||undefined)}/>
                                (m)。
                            </React.Fragment>;
                        })}
                        <br/><Text variant="h5" css={{display:'inline-flex'}}>运行行程-检验结果：</Text>
                        <div css={{width: '12rem', display: 'inline-flex', "& > div": {width: '100%'}}}>
                            <SelectHookfork value={(inp?.行程表r) || ''}
                                            onChange={e => setInp({...inp, 行程表r: e.currentTarget.value || undefined})}/>
                        </div>
                    </div>
                </div>
                项目 C4.2.2.5.1.3 幅度（m）{'>>'}
                <div css={{display: 'flex', margin: 'auto'}}>
                    <div css={{display: 'inline-block', margin: 'auto'}}>
                        {['1次（R0.3）','2次（R0.6）','3次（R0.9）'].map((group, i: number) => {
                            return <React.Fragment key={i}>
                                <Text variant="h5">{group}:</Text>
                                显示屏数值
                                <Input value={inp?.幅度表?.[i]?.d ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('幅度表',i, inp,setInp,'d',e.currentTarget.value||undefined)}/>
                                (m)，测量值
                                <Input value={inp?.幅度表?.[i]?.m ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('幅度表',i, inp,setInp,'m',e.currentTarget.value||undefined)}/>
                                (m)，计算值
                                <Input value={inp?.幅度表?.[i]?.c ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('幅度表',i, inp,setInp,'c',e.currentTarget.value||undefined)}/>
                                (m)。
                            </React.Fragment>;
                        })}
                        <br/><Text variant="h5" css={{display:'inline-flex'}}>幅度-检验结果：</Text>
                        <div css={{width: '12rem', display: 'inline-flex', "& > div": {width: '100%'}}}>
                            <SelectHookfork value={(inp?.幅度表r) || ''}
                                            onChange={e => setInp({...inp, 幅度表r: e.currentTarget.value || undefined})}/>
                        </div>
                    </div>
                </div>
                项目 C4.2.2.5.1.6 回转角度（°）{'>>'}
                <div css={{display: 'flex', margin: 'auto'}}>
                    <div css={{display: 'inline-block', margin: 'auto'}}>
                        {['1次','2次','3次'].map((group, i: number) => {
                            return <React.Fragment key={i}>
                                <Text variant="h5">{group}:</Text>
                                显示屏数值
                                <Input value={inp?.回转表?.[i]?.d ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('回转表',i, inp,setInp,'d',e.currentTarget.value||undefined)}/>
                                (°)，测量值
                                <Input value={inp?.回转表?.[i]?.m ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('回转表',i, inp,setInp,'m',e.currentTarget.value||undefined)}/>
                                (°)，计算值
                                <Input value={inp?.回转表?.[i]?.c ||''} size={4} style={{display: 'inline-flex', width: 'unset'}}
                                       onChange={e =>tableSetInp('回转表',i, inp,setInp,'c',e.currentTarget.value||undefined)}/>
                                (°)。
                            </React.Fragment>;
                        })}
                        <br/><Text variant="h5" css={{display:'inline-flex'}}>回转角度-检验结果：</Text>
                        <div css={{width: '12rem', display: 'inline-flex', "& > div": {width: '100%'}}}>
                            <SelectHookfork value={(inp?.回转表r) || ''}
                                            onChange={e => setInp({...inp, 回转表r: e.currentTarget.value || undefined})}/>
                        </div>
                    </div>
                </div>
                项目 C4.9.7.1 风速（m/s）； 1次 {'>>'}
                <LineColumn column={6}>
                    <InputLine label={`显示屏数值：`}>
                        <SuffixInput  value={inp?.监风速?.d ||''}
                                      onChange={e=>objNestSet('监风速','d',e.currentTarget.value||undefined, inp, setInp)}>m/s</SuffixInput>
                    </InputLine>
                    <InputLine label={`测量值：`}>
                        <SuffixInput  value={inp?.监风速?.m ||''}
                                      onChange={e=>objNestSet('监风速','m',e.currentTarget.value||undefined, inp, setInp)}>m/s</SuffixInput>
                    </InputLine>
                    <InputLine label='C4.9.7.1 风速-检验结果'>
                        <SelectHookfork value={ inp?.监风速?.r ||''}
                                      onChange={e =>objNestSet('监风速','r',e.currentTarget.value||undefined, inp, setInp) }/>
                    </InputLine>
                </LineColumn>
                备注：
                <TextArea  value={inp?.监控备注 ||''} rows={4}
                           onChange={e => setInp({ ...inp, 监控备注: e.currentTarget.value||undefined}) } />
                { children }
            </InspectRecordLayout>
        );
    });

